package com.coolingme.web.dict;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

@Slf4j
public class DictSerializer extends JsonSerializer<Object> implements ContextualSerializer {

    // 自定义的注解中的枚举内部类： PROVINCE, CITY, AREA等
    private DictAnnotation.ElementType type;

    public DictSerializer() {
    }

    public DictSerializer(DictAnnotation.ElementType type) {
        this.type = type;
    }

    /**
     * 建立上下文关联方法，实现ContextualSerializer便可
     * 这里主要用户获取自定义注解，由于只靠serialize自己是获取不到字段的注解信息的
     */
    @Override
    public JsonSerializer<?> createContextual(final SerializerProvider serializerProvider,
                                              final BeanProperty beanProperty) throws JsonMappingException {
        System.out.println(beanProperty);
        // 为空直接跳过
        if (beanProperty != null) {
            DictAnnotation sensitiveInfo = beanProperty.getAnnotation(DictAnnotation.class);
            if (sensitiveInfo == null) {
                sensitiveInfo = beanProperty.getContextAnnotation(DictAnnotation.class);
            }
            // 如果能得到注解，就将注解的 value 传入 DictAnnotationSerialize
            if (sensitiveInfo != null) {
                return new DictSerializer(sensitiveInfo.type());
            }
            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
        }
        return serializerProvider.findNullValueSerializer(beanProperty);
    }

    /**
     * 主要方法，处理增长一个label字段的操做
     */
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 字段自己的序列化操做，好比目前传入的是areaCode=10001，则先序列化areaCode：10001
//        defSerializer.serialize(value, gen, serializers);

        // 有自定义注解的type标识，咱们就增长一个对应的label，例：areaCode则 增长一个areaCodeVtTestLabel字段
        if (type != null) {
            // 原字段名 例：areaCode
            String fieldName = gen.getOutputContext().getCurrentName();
            // 字段对应的label 如 高新园区
//            String codeLabel = RedisUtils.dictCodeToLabel(type, value.toString());
            String codeLabel = "哈哈哈";
            // 写入
            gen.writeString(codeLabel);
//            gen.writeNumber(Integer.valueOf(value.toString()));
//            gen.writeStringField(fieldName.concat(LABEL_SUFFIX), codeLabel);
//            gen.writeFieldName(fieldName.concat(LABEL_SUFFIX) + codeLabel);
        }
    }
}